package com.base.core.utils;

import org.apache.commons.lang3.ArrayUtils;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

public class ArrayMergeUtils {

    /**
     * 求并集（set的唯一性）
     *
     * @param srcArray  将被合并的数组
     * @param destArray 将要合并的数组
     * @return 返回两个数组的并集
     */
    public static <T> Object[] union(T[] srcArray, T[] destArray) {
        if (ArrayUtils.isEmpty(srcArray) && ArrayUtils.isEmpty(destArray)) {
            return null;
        } else if (ArrayUtils.isNotEmpty(srcArray) && ArrayUtils.isEmpty(srcArray)) {
            return srcArray;
        } else if (ArrayUtils.isEmpty(srcArray) && ArrayUtils.isNotEmpty(destArray)) {
            return destArray;
        }
        HashSet<T> set = new HashSet<T>(Arrays.asList(srcArray));
        set.addAll(new HashSet<T>(Arrays.asList(destArray)));
        return set.toArray();
    }

    /**
     * 求交集
     *
     * @param srcArray  原数组
     * @param destArray 目标数组
     * @return 返回两个数组的交集
     */
    public static <T> Object[] intersect(T[] srcArray, T[] destArray) {
        if (ArrayUtils.isEmpty(srcArray) || ArrayUtils.isEmpty(destArray)) {
            return null;
        }
        HashSet<Object> set = new HashSet<>(Arrays.asList(srcArray));
        set.retainAll(Arrays.asList(destArray));
        return set.toArray();
    }

    /**
     * 求差集
     *
     * @param m  原数组
     * @param n 目标数组
     * @return 两个数组的差集
     */
    public static <T> Object[] diff(T[] m, T[] n) {
        // 将较长的数组转换为set
        Set<T> set = new HashSet<T>(Arrays.asList(m.length > n.length ? m : n));

        // 遍历较短的数组，实现最少循环
        for (T i : m.length > n.length ? n : m) {
            // 如果集合里有相同的就删掉，如果没有就将值添加到集合
            if (set.contains(i)) {
                set.remove(i);
            } else {
                set.add(i);
            }
        }
        return set.toArray();
    }

//	public static void main(String[] args) {
//		// 测试union
//		String[] arr1 = { "abc", "df", "abc", "dd", "bdfe" };
//		String[] arr2 = { "abc", "cc", "df", "d", "abc" };
//		Object[] result_union = union(arr1, arr2);
//		System.out.println("求并集的结果如下：");
//		for (Object str : result_union) {
//			System.out.println(str);
//		}
//	}

}
